package com.sky.controller.admin;

import com.sky.dto.OrdersCancelDTO;
import com.sky.dto.OrdersConfirmDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.OrdersService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@Api(tags = "管理端-订单管理接口")
@Slf4j
@RestController("adminOrdersController") // 标识当前类是请求类, 设置Bean的名字
@RequestMapping("/admin/order") //路径抽取
public class OrdersController {

    @Autowired
    private OrdersService ordersService;

    /**
     * 订单搜索
     *
     * @param dto
     * @return
     */
    @ApiOperation("订单搜索")
    @GetMapping("/conditionSearch")
    public Result<PageResult> adminPageQuery(OrdersPageQueryDTO dto) {
        //1、入口输出日志
        log.info("admin订单搜索:参数:dto={}", dto);
        //2、调用service层,进行逻辑处理, 并获取数据
        PageResult pageResult = ordersService.adminPageQuery(dto);
        log.info("---------------------{}",pageResult);
        //3、返回数据
        return Result.success(pageResult);
    }

    /**
     * 各状态的订单数量统计
     *
     * @return
     */
    @ApiOperation("各状态的订单数量统计")
    @GetMapping("/statistics")
    public Result<OrderStatisticsVO> statistics() {
        //1、直接调用service,进行获取数据
        OrderStatisticsVO orderStatisticsVO = ordersService.statistics();
        //2、响应结果
        return Result.success(orderStatisticsVO);
    }

    /**
     * 查询订单详情
     *
     * @param id
     * @return
     */
    @ApiOperation("查询订单详情")
    @GetMapping("/details/{id}")
    public Result<OrderVO> getOrderDetails(@PathVariable Long id) {
        //1、输出日志
        log.info("查询订单详情:订单号id={}", id);
        //2、调用service,层进行获取数据
        OrderVO orderAndDetails = ordersService.getOrderAndDetails(id);

        return Result.success(orderAndDetails);
    }

    /**
     * 接单
     *
     * @param dto
     * @return
     */
    @ApiOperation("接单")
    @PutMapping("/confirm")
    public Result confirm(@RequestBody OrdersConfirmDTO dto) {
        //1、输出日志
        log.info("接单: 参数dto={}", dto);
        //2、调用service, 进行更新状态
        ordersService.confirm(dto);
        //响应结果
        return Result.success();
    }

    /**
     * 拒单
     *
     * @param dto
     * @return
     */
    @ApiOperation("拒单")
    @PutMapping("/rejection")
    public Result rejection(@RequestBody OrdersRejectionDTO dto) throws Exception {
        //1、输出日志
        log.info("拒单: 参数:dto={}", dto);
        //2、调用service, 进行状态修改
        ordersService.rejection(dto);
        //3、响应结果
        return Result.success();
    }

    /**
     * 取消订单
     *
     * @param dto
     * @return
     */
    @ApiOperation("取消订单")
    @PutMapping("/cancel")
    public Result cancel(@RequestBody OrdersCancelDTO dto) throws Exception {
        //1、入口, 输出日志
        log.info("取消订单:参数:dto={}", dto);
        //2、调用service, 进行更新
        ordersService.adminCancel(dto);
        //3、响应结果
        return Result.success();
    }

    /**
     * 派送订单
     *
     * @param id
     * @return
     */
    @ApiOperation("派送订单")
    @PutMapping("/delivery/{id}")
// 需求: 用户点击派送后进行送餐
    public Result adminDelivery(@PathVariable("id") Long id) {
        //1、输出日志
        log.info("派送订单:参数:id={}", id);
        //2、调用service1层,完成更新
        ordersService.adminDelivery(id);
        //3、响应
        return Result.success();
    }

    /**
     * 完成订单
     * @param id
     * @return
     */
    @ApiOperation("完成订单")
    @PutMapping("/complete/{id}")
    public Result adminComplete(@PathVariable("id") Long id) {
        //1、入口, 输出日志
        log.info("完成订单:参数:id={}",id);
        //2、调用service层, 完成更新
        ordersService.adminComplete(id);
        //3、响应结果
        return Result.success();
    }

}
